package middleware

import (
	"data_service/models"
	"github.com/gin-gonic/gin"
	"net/http"
)

// AdminRequired 检查用户是否为管理员的中间件
// 注意：这是一个简化的认证，生产环境应使用更安全的方案
func AdminRequired() gin.HandlerFunc {
	return func(c *gin.Context) {
		// 从请求头中获取用户ID和Token
		userID := c.GetHeader("X-User-ID")
		token := c.GetHeader("X-Token")

		// 检查用户ID和Token是否存在
		if userID == "" || token == "" {
			// 如果缺少认证信息，则中止请求并返回401 Unauthorized错误
			c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{"error": "需要认证"})
			return
		}

		// 根据用户ID查询数据库
		var user models.User
		if err := models.GetDB().First(&user, userID).Error; err != nil {
			// 如果找不到用户，则中止请求并返回401 Unauthorized错误
			c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{"error": "用户不存在"})
			return
		}

		// 检查用户的角色是否为 'admin'
		if user.Role != "admin" {
			// 如果用户不是管理员，则中止请求并返回403 Forbidden错误
			c.AbortWithStatusJSON(http.StatusForbidden, gin.H{"error": "需要管理员权限"})
			return
		}

		// --- 简化的Token验证 ---
		// 在一个真实的系统中，这里应该有更复杂的逻辑来验证Token的有效性，
		// 例如，解析JWT并检查其签名和过期时间。
		// 此处仅作示例，未进行实际的Token验证。

		// 将用户信息存储在当前请求的上下文中，以便后续处理器使用
		c.Set("user", user)

		// 继续处理请求链中的下一个中间件或处理器
		c.Next()
	}
}
